package com.mastercard.assets.web.struts.actions;

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.jpa.TblTipoCampania;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.notifications.NotificationUtil;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.AssetAltaForm;
import com.mastercard.assets.web.struts.forms.AssetAsignarPaquetesForm;
import com.mastercard.assets.web.struts.forms.AssetBorrarForm;
import com.mastercard.assets.web.struts.forms.AssetBuscarForm;
import com.mastercard.assets.web.struts.forms.AssetEditarForm;
import com.mastercard.assets.web.struts.forms.AssetModificarPaquetesForm;
import com.mastercard.assets.web.struts.forms.CampanasPorAutorizarForm;
import com.mastercard.assets.web.struts.forms.GenerarCampanaForm;
import com.mastercard.assets.web.struts.forms.GenerarCampanaRegistrarForm;
import com.mastercard.assets.web.struts.forms.LoginForm;
import com.mastercard.assets.web.util.to.ManejadorPaquetesAsignados;
import com.mastercard.assets.web.util.to.PaqueteAutorizado;
import com.mastercard.assets.web.util.to.UserLogin;

public class CampanasPorAutorizarRegistrarIn
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// verifica que el rol en el que esta es banco (2)
		int role = user.getActualRoleId( ) ;
		
		if( role != 2 )
			return mapping.findForward( "RoleNoValido" ) ;
		
		// formulario
		CampanasPorAutorizarForm f = ( CampanasPorAutorizarForm ) form ;
		
		// en caso de null
		if( f == null )
			return mapping.findForward( "SourceInvalid" ) ;
		
		int operation = f.getOperation( ) ;
		int cveCampania = f.getCveCampania( ) ;
		int page = f.getPage( ) ;
		
		System.out.println( "CamapanasPorAutorizarRegistrarIn.java: operation/" + operation  ) ;
		System.out.println( "CamapanasPorAutorizarRegistrarIn.java: page/" + page ) ;
		System.out.println( "CamapanasPorAutorizarRegistrarIn.java: cveCampania/" + cveCampania ) ;
		
		// verifica la pagina de la que viene
		// en caso de no venir de alguna
		if( page < 1 )
			return mapping.findForward( "SourceInvalid" ) ;
		// en caso de que venga de alguna pagina
		// en caso del detalle
		else if( page == 1 )
		{
			// verifica la operation
			if( operation < 1 )
				return mapping.findForward( "NoOperation" ) ;
			
			// en caso de que no venga con cveCampania
			if( cveCampania < 1 )
				return mapping.findForward( "NoCampaignId" ) ;
			
			// en caso de que si venga con una operacion y con la cveCampania
			// en caso de operacion 2 (rechazar)
			if( operation == 2 )
			{
				TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
				
				// en caso de que no haya campani
				if( campania == null || campania.getStatus( ) == 0 )
					return mapping.findForward( "CampaignNotExist" ) ;
				
				// en caso de que si exista
				// coloca en el form
				f.setCampania( campania ) ;
				
				// guarda el form en el request
				request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
				// dirige a la pantalla de confirmacion de rechazo
				return mapping.findForward( "RejectCampaign" ) ;
			}
			// en caso de 1 (autorizar)
			else if( operation == 1 )
			{
				TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
				
				System.out.println( "CampanasPorAutorizar: autorizar/campania/" + campania ) ;
				
				// en caso de que no haya campani
				if( campania == null || campania.getStatus( ) == 0 )
					return mapping.findForward( "CampaignNotExist" ) ;
				
				// en caso de que si exista
				// coloca en el form
				f.setCampania( campania ) ;
				
				// guarda el form en el request
				request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
				return mapping.findForward( "AuthorizeCampaign" ) ;
			}
			// operacion de regresar
			else if( operation == 3 )
			{
//				System.out.println( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!1" ) ;
				return mapping.findForward( "ListarCampanas" ) ;
			}
			// operacion de cancelar campania
			else if( operation == 4 )
			{
				TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
				
				try
				{
					MasterCardDAO.cancelCampaign( cveCampania , user.getCveUsuario( ) , 2 ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
					return mapping.findForward( "ListarCampanas" ) ;
				}catch( Exception e )
				{
                                    MasterCardDAO.closeEntityManager( ) ;
					e.printStackTrace( ) ;
					user.setMessageError( e.getMessage( ) ) ;
					user.setNextWorkArea( "/WEB-INF/pages/WorkArea/ListarCampanasError.jsp" ) ;
					return mapping.findForward( "ListarCampanas" ) ;
				}
			}
			// operacion de eliminar bussines case
			else if( operation == 5 )
			{
				TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
				
				try
				{
					MasterCardDAO.dropBCOfCampaign( cveCampania ) ;
					
					String dirPath = getServlet( ).getServletContext( ).getRealPath( "/WEB-INF/bc" ) ;
					MCUtil.dropAllBCOfCampania( dirPath , cveCampania ) ;
					
					user.setNextWorkArea( "/CampanasPorAutorizarCampanaDetalleIn.do?cveCampania=" + request.getParameter( "cveCampania" ) ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
					return mapping.findForward( "DesplegarDetalle" ) ;
				}catch( Exception e )
				{
                                    MasterCardDAO.closeEntityManager( ) ;
					e.printStackTrace( ) ;
					user.setMessageError( e.getMessage( ) ) ;
					user.setNextWorkArea( "/WEB-INF/pages/WorkArea/ListarCampanasError.jsp" ) ;
					return mapping.findForward( "ListarCampanas" ) ;
				}
			}
			// en cualquier otro caso
			else
				return mapping.findForward( "NoOperation" ) ;
		}// finaliza if page == 1
		// en caso de que pagina sea de confirmacion de rechazo
		else if( page == 2 )
		{
			// verifica la operation
			if( operation < 1 )
				return mapping.findForward( "NoOperation" ) ;
			
			// en caso de que no venga con cveCampania
			if( cveCampania < 1 )
				return mapping.findForward( "NoCampaignId" ) ;
			
			// en caso de que si venga con una operacion y con la cveCampania
			// en caso de operacion 2 (cancelar)
			if( operation == 2 )
			{
				// dirige a la pantalla de confirmacion de rechazo
				return mapping.findForward( "DesplegarDetalle" ) ;
			}
			// en caso de 1 (rechazar)
			else if( operation == 1 )
			{
				try
				{
//					MasterCardDAO.unauthorizeCampaign( cveCampania ) ;
                                        MasterCardDAO.cancelCampaign( cveCampania , user.getCveUsuario( ), 2 ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
					// en cuanto se vaya a rechar se dirige al detalle
					return mapping.findForward( "DesplegarDetalle" ) ;
				}catch( Exception e )
				{
					user.setMessageError( e.getMessage( ) ) ;
					return mapping.findForward( "Error" ) ;
				}
			}
			// en cualquier otro caso
			else
				return mapping.findForward( "NoOperation" ) ;
		}// temrina page == 2
		// en caso de que venga de page 3 (subir bussinesCase)
		else if( page == 3 )
		{
			// verifica la operation
			if( operation < 1 )
				return mapping.findForward( "NoOperation" ) ;
			
			// en caso de que no venga con cveCampania
			if( cveCampania < 1 )
				return mapping.findForward( "NoCampaignId" ) ;
			
			// en caso de que si venga con una operacion y con la cveCampania
			// en caso de operacion 2 (cancelar)
			if( operation == 2 )
			{
				// dirige a la pantalla de confirmacion de rechazo
				return mapping.findForward( "DesplegarDetalle" ) ;
			}
			// en caso de 1 (rechazar)
			else if( operation == 1 )
			{
				try
				{
					FormFile bc = f.getBc( ) ;
					
//					// revisa que el form no sea null
//					if( bc == null || bc.getFileName( ).trim( ).length( ) == 0 )
//					{
//						user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.BussinesCaseEmtpy" ) ) ;
//
//						TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
//						
//						// en caso de que no haya campani
//						if( campania == null || campania.getStatus( ) == 0 )
//							return mapping.findForward( "CampaignNotExist" ) ;
//						
//						// en caso de que si exista
//						// coloca en el form
//						f.setCampania( campania ) ;
//						
//						// guarda el form en el request
//						request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
//						
//						return mapping.findForward( "AuthorizeCampaign" ) ;
//					}
//					
					String bcName = null ;
					
					if( bc != null && bc.getFileName( ).trim( ).length( ) > 0 )
					{
						// en caso dr que no sea null
						String name = bc.getFileName( ) ;
						String ext = name.substring( name.lastIndexOf( "." ) + 1 ) ;
						
	//					// revisa extension
	//					if( ! ext.equals( "pdf" ) )
	//					{
	//						user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.BussinesCaseWrongExtention" ) ) ;
	//
	//						TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
	//						
	//						// en caso de que no haya campani
	//						if( campania == null || campania.getStatus( ) == 0 )
	//							return mapping.findForward( "CampaignNotExist" ) ;
	//						
	//						// en caso de que si exista
	//						// coloca en el form
	//						f.setCampania( campania ) ;
	//						
	//						// guarda el form en el request
	//						request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
	//						
	//						return mapping.findForward( "AuthorizeCampaign" ) ;
	//					}
						
						// guarda el archivo en /WEB-INF/bc
						bcName = "BusinessCase-" + cveCampania + "." + ext ;
						
						// toma el File
						String dirPath = getServlet( ).getServletContext( ).getRealPath( "/WEB-INF/bc" ) ;
						System.out.println( dirPath + System.getProperty( "file.separator" ) + bcName ) ;
						
						try
						{
							FileOutputStream out = new FileOutputStream( dirPath + System.getProperty( "file.separator" ) + bcName ) ;
							out.write( bc.getFileData( ) ) ;
							out.close( ) ;
						}catch( Exception e )
						{
							user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.Error" , e.getMessage( ) ) ) ;
	
							TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
							
							// en caso de que no haya campani
							if( campania == null || campania.getStatus( ) == 0 )
								return mapping.findForward( "CampaignNotExist" ) ;
							
							// en caso de que si exista
							// coloca en el form
							f.setCampania( campania ) ;
							
							// guarda el form en el request
							request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
							
                                                        MasterCardDAO.closeEntityManager( ) ;
							return mapping.findForward( "AuthorizeCampaign" ) ;
						}
					}
					
					try
					{
						// autoriza la campana
						MasterCardDAO.authorizeCampaign( user , cveCampania , bcName ) ;
						
					}catch( Exception e )
					{
                                            MasterCardDAO.closeEntityManager( ) ;
						user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.autorizarcampana.errors.Error" , e.getMessage( ) ) ) ;

						TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
						
						// en caso de que no haya campani
						if( campania == null || campania.getStatus( ) == 0 )
							return mapping.findForward( "CampaignNotExist" ) ;
						
						// en caso de que si exista
						// coloca en el form
						f.setCampania( campania ) ;
						
						// guarda el form en el request
						request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
						
						return mapping.findForward( "AuthorizeCampaign" ) ;
					}
					
                                        MasterCardDAO.closeEntityManager( ) ;
					// en cuanto se vaya a rechar se dirige al detalle
					return mapping.findForward( "DesplegarDetalle" ) ;
				}catch( Exception e )
				{
                                    MasterCardDAO.closeEntityManager( ) ;
					user.setMessageError( e.getMessage( ) ) ;
					return mapping.findForward( "Error" ) ;
				}
			}
			// en cualquier otro caso
			else
				return mapping.findForward( "NoOperation" ) ;
		}// termina page ==3
		// en caso de otra pagina
		else
			return mapping.findForward( "SourceInvalid" ) ;
		
	}
	
}
